package org.opencv.test1;

import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.text.format.DateFormat;

public class Utility {
	public static String createName(long dateTaken) {
		return DateFormat.format("yyyyMMddkkmmss", dateTaken).toString();
	}

	public static Bitmap rotate(Bitmap b, int degrees) {
		if (degrees != 0 && b != null) {
			Matrix m = new Matrix();
			m.setRotate(degrees, (float) b.getWidth() / 2,
					(float) b.getHeight() / 2);
			try {
				Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
						b.getHeight(), m, true);
				if (b != b2) {
					b.recycle();
					b = b2;
				}
			} catch (OutOfMemoryError ex) {
				// We have no memory to rotate. Return the original bitmap.
			}
		}
		return b;
	}

	public static int getRotationFromImage(String imagePath) {
		int degrees = 0;
		try {
			ExifInterface exif = new ExifInterface(imagePath);
			int orientation = exif.getAttributeInt(
					ExifInterface.TAG_ORIENTATION, 0);
			switch (orientation) {
			case ExifInterface.ORIENTATION_ROTATE_90:
				degrees = 90;
				break;
			case ExifInterface.ORIENTATION_ROTATE_180:
				degrees = 180;
				break;
			case ExifInterface.ORIENTATION_ROTATE_270:
				degrees = 270;
				break;
			default:
				degrees = 0;
				break;
			}

		} catch (Exception e) {

		}
		return degrees;
	}

	public static int[] decodeYUV420SP( byte[] yuv420sp, int width, int height) {   

		final int frameSize = width * height;   

		int rgb[]=new int[width*height];   
		for (int j = 0, yp = 0; j < height; j++) {   
			int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;   
			for (int i = 0; i < width; i++, yp++) {   
				int y = (0xff & ((int) yuv420sp[yp])) - 16;   
				if (y < 0) y = 0;   
				if ((i & 1) == 0) {   
					v = (0xff & yuv420sp[uvp++]) - 128;   
					u = (0xff & yuv420sp[uvp++]) - 128;   
				}   

				int y1192 = 1192 * y;   
				int r = (y1192 + 1634 * v);   
				int g = (y1192 - 833 * v - 400 * u);   
				int b = (y1192 + 2066 * u);   

				if (r < 0) r = 0; else if (r > 262143) r = 262143;   
				if (g < 0) g = 0; else if (g > 262143) g = 262143;   
				if (b < 0) b = 0; else if (b > 262143) b = 262143;   

				rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) &    
						0xff00) | ((b >> 10) & 0xff);   


			}   
		}   
		return rgb;   
	} 


}